exe、msi、dos、bat等静默运行,后台运行,不弹窗的解决办法 | 您所在的位置:网站首页 › bat 双击 窗口运行 › exe、msi、dos、bat等静默运行,后台运行,不弹窗的解决办法 |
1、exe程序本身不想显示,
在源码开头中加入 #pragma comment( linker, "/subsystem:windows /entry:mainCRTStartup" ) 2、打开其他的exe 2.1使用WinExec(LPCSTR, UInt)函数 其第一个参数相当于system函数的参数,第二个参数可以设置窗口是否显示,SW_HIDE这个宏表示隐藏窗口,例如: WinExec(cmd.c_str(),SW_HIDE);//cmd(string类型)中为我们要调用的程序名及其参数, 如 “dir *.exe ” 但是这个有一个问题,这个函数创建完这个进程后就返回了,也就是说它返回后,该进程不一定已经结束 另外,第一个参数不能有空格
2.2 使用ShellExecute函数 ShellExecute(NULL,"open","calc.exe","","", SW_HIDE);
2.3 使用ShellExecuteEx函数 ShellExecuteEx(SHELLEXECUTEINFO*)函数 其参数是一个结构体,具体作用还是类似于system的参数,使用例子: SHELLEXECUTEINFO ShExecInfo = {0}; ShExecInfo.cbSize = sizeof(SHELLEXECUTEINFO); ShExecInfo.fMask = SEE_MASK_NOCLOSEPROCESS; //确保返回hProcess用于了解打开的东西的生命周期 ShExecInfo.hwnd = NULL; ShExecInfo.lpVerb = NULL; ShExecInfo.lpFile = cmd.c_str();//调用的程序名 ShExecInfo.lpParameters = par.c_str();//调用程序的命令行参数 ShExecInfo.lpDirectory = NULL; ShExecInfo.nShow = SW_HIDE;//窗口状态为隐藏 ShExecInfo.hInstApp = NULL; ShellExecuteEx(&ShExecInfo);WaitForSingleObject(ShExecInfo.hProcess,INFINITE);//等到该进程结束 ,当然可以不等待。。 CloseHandle(ShExecInfo.hProcess) ; //释放资源 3.CreateProcess函数 STARTUPINFO si; PROCESS_INFORMATION pi; LPTSTR szCmdline = _tcsdup(TEXT("MyChildProcess")); ZeroMemory(&si, sizeof(si)); si.cb = sizeof(si); si.dwFlags = STARTF_USESHOWWINDOW; si.wShowWindow = SW_HIDE; ZeroMemory(&pi, sizeof(pi)); // Start the child process. if (!CreateProcess(NULL, // No module name (use command line) szCmdline, // Command line NULL, // Process handle not inheritable NULL, // Thread handle not inheritable FALSE, // Set handle inheritance to FALSE CREATE_NO_WINDOW, // No Console window NULL, // Use parent's environment block NULL, // Use parent's starting directory &si, // Pointer to STARTUPINFO structure &pi) // Pointer to PROCESS_INFORMATION structure ) { printf("CreateProcess failed (%d)./n", GetLastError()); return; } // Wait until child process exits. WaitForSingleObject(pi.hProcess, INFINITE); // Close process and thread handles. CloseHandle(pi.hProcess); CloseHandle(pi.hThread); 3、打开msi文件(隐藏安装过程) 可以通过bat文件,输入 xxx.msi /qn q意思是quiet,n意思是没有用户交互 如果通过shell打开的话,注意msi只是个安装文件,安装程序为msiexec.exe system("msiexec.exe /i \"E:\\vcredist_x86\\vcredist.msi\" /qn"); (这个会弹一个控制台的框system本身) 下面的方法可以啥都不弹。 SHELLEXECUTEINFO ShExecInfo = { 0 }; ShExecInfo.cbSize = sizeof(SHELLEXECUTEINFO); ShExecInfo.fMask = SEE_MASK_NOCLOSEPROCESS; ShExecInfo.hwnd = NULL; ShExecInfo.lpVerb = NULL; ShExecInfo.lpFile = L"Msiexec.exe";//调用的程序名 ShExecInfo.lpParameters = L"/i \"E:\\vcredist_x86\\vcredist.msi\" /qn";//调用程序的命令行参数 ShExecInfo.lpDirectory = NULL; ShExecInfo.nShow = SW_HIDE;//窗口状态为隐藏 ShExecInfo.hInstApp = NULL; if (!ShellExecuteEx(&ShExecInfo)) { printf("%d", GetLastError()); } WaitForSingleObject(ShExecInfo.hProcess,30000); CloseHandle(ShExecInfo.hProcess);
4、bat文件 bat文件运行时会有一个黑黑的cmd.exe窗口,很吓人,就算用start/min命令去运行bat文件,电脑的任务栏下仍然会有相关的图标,怎么让bat文件在后台无声无息无影无形地运行呢?以下的办法可以达到你的目的。 方法一、bat里有隐藏窗口的命令,很简单,只需要在代码头部加一段代码就可以了。 @echo off if "%1" == "h" goto begin mshta vbscript:createobject("wscript.shell").run("%~nx0 h",0)(window.close)&&exit :begin ::下面是你自己的代码。 方法二、在你批处理的相同目录下新建一个记事本,里面输入: DIM objShell set objShell=wscript.createObject("wscript.shell") iReturn=objShell.Run("cmd.exe /C c:\1.bat", 0, TRUE) (其中win.bat为你自己的批处理名字,自己改) 然后把这个记事本保存为后缀名为.vbe的文件,到时候你只要运行这个vbe文件就达到目的了! 可以写的简单点: Set ws = CreateObject("Wscript.Shell") ws.run "cmd /c c:\1.bat",0 或 CreateObject("WScript.Shell").Run "cmd /c c:\1.bat",0 (这种写法很多杀软报毒, 需要替换参数0) 最后那个0是指窗口参数,用法为: 0 隐藏窗口并激活另一窗口。 1 激活并显示一个窗口。若窗口是最小化或最大化,则恢复到其原来的大小和位置。 2 激活窗口并以最小化显示该窗口。 3 激活窗口并以最大化显示该窗口。 4 按窗口最近的大小和位置显示。活动窗口保持活动。 5 以当前大小和位置激活并显示窗口。 6 最小化指定窗口并激活按 Z 序排序的下一个顶层窗口。 7 最小化显示窗口。活动窗口保持活动。 8 以当前状态显示窗口。活动窗口保持活动。 9 激活并显示窗口。若窗口是最小化或最大化,则恢复到原来的大小和位置。在还原应用程序的最小化窗口时,应指定该标志。 |
CopyRight 2018-2019 实验室设备网 版权所有 |